.. _cmmIxxHelOnce: cmmIxxHelOnce ======================== ------------------------ SYNOPSIS ``````````` .. code-block:: none VT_I4 cmmIxxHelOnce( [in] VT_I4 HelId, [in] VT_I4 NumAxes, [in] VT_PI4 AxisList, [in] VT_PR8 CoordList, [in] VT_R8 ArcAngle, [out] VT_PR8 DistU, [in] VT_I4 IsBlocking) DESCRIPTION ````````````````````` - 2 축 원호보간과 1 축 또는 2 축 직선보간을 동시에 시작하고 동시에 종료하는 헬리컬보간 구동을 시작합니다. cmmIxxHelOnce() 함수는 모션이 완료되기 전까지 반환되지 않으며, cmmIxxHelOnceStart() 함수는 모션을 시작시킨 후에 바로 반환됩니다. \ - 헬리컬보간 구동에서 원호보간 이동은 그 속도와 이동량이 U 축(4 축 모션보드인 경우 Axis3, 8 축 모션보드인 경우 Axis3 또는 Axis7)과 동기되어 움직입니다. 따라서 U 축은 헬리컬보간에서 반드시 포함되어야 하며, 채널리스트의 마지막 축이 반드시 U 축으로 설정되어야 합니다. 그리고 U 축은 원호보간과 동기되어 움직이므로 이송량이 자동으로 결정됩니다. \ - 원호보간을 위한 2 축과 Z 축은 4 축 모션보드인 경우에 CH0, CH1, CH2 그리고 8 축 모션보드인 경우에 CH0, CH1, CH2 축 중에서, 혹은 CH4, CH5, CH6 축 중에서 임의로 조합하여 사용할 수 있습니다. 이 때에 CH0~2, CH4~6 이 각각의 그룹으로서 서로 교차하여 조합할 수는 없습니다. PARAMETER ````````````````` - HelId : 이송하고자 하는 헬리컬 보간 이송 작업의 아이디를 지정합니다. CMMSDK 는 통합라이브러리이므로 여러 개의 보드가 장착되어 있는 경우에 여러 개의 헬리컬 보간 작업을 동시에 수행할 수도 있습니다. 따라서 각각의 작업을 구분지어줄 아이디가 필요합니다. cmmIxxHelOnceSetSpeed()의 헬리컬 이송 속도를 설정하는 함수도 HelId 를 입력하게 되어 있는데, 동일한 HelId 로 설정한 속도 패턴이 적용되게 됩니다. \ - nNumAxes : 헬리컬보간에 사용되는 축 수. 이 값은 3 또는 4 이어야 합니다. \ - nAxisList : 헬리컬보간에 사용되는 축 배열의 주소값. 이 배열의 마지막 Element 값은 4 축 모션 보드인 경우에는 반드시 3 이어야 하며 8 축 모션 보드인 경우에는 반드시 3 또는 7 이어야 합니다. 이 배열의 구성은 다음과 같이 하면 됩니다. nAxisList[0] : 원호보간의 X 축. nAxisList[1] : 원호보간의 Y 축. nAxisList[2] : Z 축 (3 축만 사용하는 경우에는 U 축) nAxisList[3] : U 축 (3 축만 사용하는 경우에는 이 매개 변수는 사용안함) \ - CoordList : 좌표 배열 주소. 3 축을 사용하는 경우와 4 축을 사용하는 경우에 이 배열의 구성은 다음과 같이 하면 됩니다. □ 3 축을 사용하는 경우 nCoordList[0] : 원호 중심의 X 상대좌표값 nCoordList[1] : 원호 중심의 Y 상대좌표값 nCoordList[2] : U 축 방향 (0 또는 음수: 음의 방향, 양수: 양의 방향) □ 4 축을 사용하는 경우 nCoordList[0] : 원호 중심의 X 상대좌표값 nCoordList[1] : 원호 중심의 Y 상대좌표값 nCoordList[2] : Z 축 이동거리(상대좌표) nCoordList[3] : U 축 방향 (0 또는 음수: 음의 방향, 양수: 양의 방향) - ArcAngle : 원호보간 이동 각도. 이 값이 음수이면 시계방향으로 양수이면 반시계 방향으로 원호를 그리게 되며, 이 값의 절대값이 360 보다 클수 없습니다. \ - DistU : 헬리컬 보간은 X 축과 Y 축의 원호보간과 U 축의 직선 보간이 동기 되어 동작되는 보간법입니다. 이 보간 법을 통해 동작하는 X 축과 Y 축의 원호 보간에 의해 이송되는 원의 둘레에 대한 거리는 U 축의 이송거리와 동일하게 됩니다. DistU 매개 변수는 U 축의 이송 거리를 반환하는 매개 변수입니다. U 축의 실제 이송한 거리를 알기 위하실 경우 유용하게 사용하실 수 있습니다. .. image:: 6장_1.jpg - IsBlocking : 함수의 동작시에 블록킹 처리에 대한 매개변수를 요구합니다. 블록킹(Blocking) 처리는 함수의 동작시에 윈도우 메시지를 처리 여부를 결정하게 됩니다. EXAMPLE 1 - 아래의 코드는 하나의 360 도 원을 그리면서 Z 축도 +3000 만큼 이송하는 헬리컬 보간을 수행하는 예입니다. 이때 Z 축 속도를 V=5000, ACC=DEC=25000 으로 설정하고, 원호보간 속도는 원주 길이와 Z 축 이동거리의 비에 따라 자동으로 설정되도록 합니다. .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #define HEL_ID 0 // Helical ID cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_S, 5000, 25000, 25000); // 대상 축 설정 long nAxes[4] = {0, 1, 2, 3}; // 보간 이송 위치 결정 double fCoords[4] = {5000, 5000, 3000, cmDIR_P}; // 헬리컬 보간 이송 cmmIxxHelOnce(HEL_ID, 4, nAxes, fCoords, 360, NULL, TRUE); … .. code-block:: none :linenos: Visual Basic ‘HEL_ID 는 이미 선언되어 있다고 가정함. Call cmmIxxHelOnceSetSpeed(HEL_ID,2, cmSMODE_S, 5000, 25000, 25000) Dim nAxes(4) As Long Dim fCoords(4) As Double ‘ 대상 축 설정 nAxes(0) = 0 nAxes(1) = 1 nAxes(2) = 2 nAxes(3) = 3 ‘ 보간 이송 위치 설정 fCoords(0) = 5000 fCoords(1) = 5000 fCoords(2) = 3000 fCoords(3) = cmDIR_P ‘ 헬리컬 보간 이송 Call cmmIxxHelOnce(HEL_ID, 4, nAxes(0), fCoords(0), 360, Null, True) … .. code-block:: none :linenos: Delphi Const HEL_ID = 0; // Helical ID var nAxes : Array[0..3] of LongInt; fCoords : Array[0..3] of Double; begin cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_S, 5000, 25000, 25000); // 대상 축 설정 nAxes[0] := 0; nAxes[1] := 1; nAxes[2] := 2; nAxes[3] := 3; // 보간 이송 위치 결정 fCoords[0] := 5000; fCoords[1] := 5000; fCoords[2] := 3000; fCoords[3] := cmDIR_P; // 헬리컬 보간 이송 cmmIxxHelOnce(HEL_ID, 4, @nAxes, @fCoords, 360, NIL , cmTRUE); … end; EXAMPLE 2 ````````````` - 아래 그림 9-3 과 같이 X,Y 축에 대하여 5 회의 원호보간을 수행하면서 동시에 Z 축을 이동하면서 헬리컬보간을 수행하는 예제입니다. 이때 마지막 ARC 의 각도는 90 도로 하여 처음 시작점을 기준으로 90 도 원호를 그리고 종료하도록 합니다. 5 회의 원호보간 이송이 연속적으로 수행되도록 하기 위해서 리스트모션을 사용하였습니다. .. image:: 6장_2.jpg .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #define LM_MAP 0 #define HEL_ID 0 long nAxisList[4] = {cmX1, cmY1, cmZ1, cmU1}; double fCoords[4] = {5000, 5000, 3000, cmDIR_P}; // X1&Y1&Z1&U1 축을 리스트모션에 관계된 축으로 설정 // cmmLmMapAxes (LM_MAP, 0xf, 0x0); // 모션 리스트 등록 시작 // cmmLmBeginList (LM_MAP); // 처음 이동은 가속=25000, 감속구간 없음(0)으로 설정 // // 헬리컬보간 이동 : 원호중심=(5000,5000), 원호이동각도=360, // cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_T, 5000, 25000, 0) // Z 축 이동량=3000, U 축 Direction=+방향 // fCoords[0] = 5000; fCoords[1] = 5000; fCoords[2] = 3000; fCoords[3] = cmDIR_P; // 헬리컬 보간 이송 시작 cmmIxxHelOnceStart(HEL_ID, 4, nAxisList, fCoords,360, NULL); // 두번째 부터는 Constant 속도 모드로 설정 // cmmIxxHelOnceSetSpeed (HEL_ID, 2, cmSMODE_C, 5000, 0, 0) cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL); cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL); cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL); cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL); // 모션리스트 등록을 마침 // cmmLmEndList (LM_MAP); cmmLmStartMotion (LM_MAP);// 리스트모션 수행 시작 // long lIsDone = FALSE; while(!lIsDone){ long nCurOperIdx=0; cmmLmIsDone(LM_MAP, &lIsDone); // 현재 수행되는 작업 번호를 확인하여 화면에 표시 // // 아래 DisplaySequence 함수는 가상의 함수입니다. // cmmLmCurSequence (LM_MAP, (long *)&nCurOperIdx); DisplaySequence(nCurOperIdx); Sleep(1); } } .. code-block:: none :linenos: Visual Basic ‘LM_MAP 은 이미 선언되어 있다고 가정함. Dim nAxisList(4) As Long Dim fCoords(4) As Double ‘ 대상 축 설정 nAxisList(0) = cmX1 nAxisList(1) = cmY1 nAxisList(2) = cmZ1 nAxisList(3) = cmU1 ‘ 이송 거리 설정 fCoords(0) = 5000 fCoords(1) = 5000 fCoords(2) = 3000 fCoords(3) = cmDIR_P '// X1&Y1&Z1&U1 축을 리스트모션에 관계된 축으로 설정 // Call cmmLmMapAxes(0, &HF, &H0) '// 모션 리스트 등록 시작 // Call cmmLmBeginList(0) '// 처음 이동은 가속=25000, 감속구간 없음(0)으로 설정 // Call cmmIxxHelOnceSetSpeed(0, 2, cmSMODE_T, 5000, 25000, 0) '// 헬리컬보간 이동 : 원호중심=(5000,5000), 원호이동각도=360, // '// Z 축 이동량=3000, U 축 Direction=+방향 // Call cmmIxxHelOnceStart(4, nAxisList(0), fCoords(0), 360, 0) '// 두번째 부터는 Constant 속도 모드로 설정 // Call cmmIxxHelOnceSetSpeed(0, 2, cmSMODE_C, 5000, 0, 0) Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null) Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null) Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null) Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null) Call cmmLmEndList(0) '// 모션리스트 등록을 마침 // Call cmmLmStartMotion(0) '// 리스트모션 수행 시작 // Dim nIsDone As Long Dim nCurOperIdx As Long nIsDone = False Do While(Not (nIsDone)) Call cmmLmIsDone(LM_MAP, nIsDone) '// 현재 수행되는 작업 번호를 확인하여 화면에 표시 // ‘//아래의 DisplaySequence 함수는 가상의 함수입니다. Call cmmLmCurSequence(LM_MAP, nCurOperIdx) DisplaySequence(nCurOperIdx) Loop .. code-block:: none :linenos: Delphi Const LM_MAP = 0; Const HEL_ID = 0; // Helical ID var nAxisList : Array[0..3] of LongInt; fCoords : Array[0..3] of Double; lIsDone : LongInt; nCurOperIdx : LongInt; begin nAxisList [0] := cmX1; nAxisList [1] := cmY1; nAxisList [2] := cmZ1; nAxisList [3] := cmU1; fCoords[0] := 5000; fCoords[1] := 5000; fCoords[2] := 3000; fCoords[3] := cmDIR_P; // X1&Y1&Z1&U1 축을 리스트모션에 관계된 축으로 설정 // cmmLmMapAxes (LM_MAP, $f, $0); // 모션 리스트 등록 시작 // cmmLmBeginList (LM_MAP); // 처음 이동은 가속=25000, 감속구간 없음(0)으로 설정 // // 헬리컬보간 이동 : 원호중심=(5000,5000), 원호이동각도=360, // cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_T, 5000, 25000, 0); // Z 축 이동량=3000, U 축 Direction=+방향 // fCoords[0] := 5000; fCoords[1] := 5000; fCoords[2] := 3000; fCoords[3] := cmDIR_P; // 헬리컬 보간 이송 시작 cmmIxxHelOnceStart(HEL_ID, 4,@nAxisList, @fCoords,360, NIL); // 두번째 부터는 Constant 속도 모드로 설정 // cmmIxxHelOnceSetSpeed (HEL_ID, 2, cmSMODE_C, 5000, 0, 0); cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL); cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL); cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL); cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL); // 모션리스트 등록을 마침 // cmmLmEndList (LM_MAP); cmmLmStartMotion (LM_MAP);// 리스트모션 수행 시작 // lIsDone := cmFALSE; while lIsDone =0 do begin nCurOperIdx := 0; cmmLmIsDone(LM_MAP, @lIsDone); // 현재 수행되는 작업 번호를 확인하여 화면에 표시 // // 아래 DisplaySequence 함수는 가상의 함수입니다. // cmmLmCurSequence (LM_MAP,@nCurOperIdx); //DisplaySequence(nCurOperIdx); Sleep(1); end; end; .. seealso:: ref:`cmmIxxHelOnceStart`